package cn.jhz.filesharingsystem.util;

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;

/**
 * 讲明文的字符串加密层密文字符串的工具类
 * @author Administrator
 *
 */
public class SecurityUtil {
	static private final String KEY = "cn.jhz.filesharingsystem@zjh.cn";
	
	private SecurityUtil() {
		
	}
	public static void main(String[] args) {

		System.out.println(md5$sha_x("1234567890@163.com", "ZJH.123"));
	}
	
	static public void createCookie(String email, HttpServletResponse resp, int sec) {
		Cookie userCookie = new Cookie("userKey", email);
		Cookie ssidCookie = new Cookie("ssid", md5$sha_x(email));
		userCookie.setMaxAge(sec);
		ssidCookie.setMaxAge(sec);
		resp.addCookie(userCookie);
		resp.addCookie(ssidCookie);
	}
	//混合加密
	static public  String md5$sha_x(String str1, String str2){
		return md5(sha1(str1), sha1(str2));
	}
	//内部键混合加密
	static public  String md5$sha_x(String str){
		return md5(sha1(KEY), sha1(str));
	}
	//项目中使用的加密的算法，比较流行的算法：MDX(MD2,MD5),SHA-X(SHA-1,SHA-256,384,512)
//	public static String md5(String str) {
//		try {
//			MessageDigest md = MessageDigest.getInstance("MD5");//这个参数就是加密的算法
//			md.update(str.getBytes()); // 明文字符串更新到md对象里
//			byte[] rs = md.digest(); //做加密计算，计算结果就是密文
//			//byte[]转16进制的字符串，BigInteger大整数
//			return new BigInteger(1, rs).toString(16);
//		} catch (NoSuchAlgorithmException e) {
//			e.printStackTrace();
//		}
//		return null;
//	}
	
	//MD5加密
	public static String md5(String...key) {
		try {
			MessageDigest md = MessageDigest.getInstance("MD5");//这个参数就是加密的算法

			for(String str: key) {
				md.update(str.getBytes());// 明文字符串更新到md对象里
			}
			byte[] rs = md.digest(); //做加密计算，计算结果就是密文
			//byte[]转16进制的字符串，BigInteger大整数
			return new BigInteger(1, rs).toString(16);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	//SHA-1加密算法
	public static String sha1(String str) {
		try {
			MessageDigest md = MessageDigest.getInstance("SHA-1");
			md.update(str.getBytes());
			byte[] rs = md.digest();
			StringBuffer sb = new StringBuffer();
			for(byte b:rs) {
				//可以将byte类型转换16进制格式是数字符串
				sb.append(String.format("%02x", b));  //%02x,一个byte类型整数----> 2位十六进制字符来表示
			}
			return sb.toString();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		return null;
	}
	
}
